namespace _1016
{
    // 存储已注册用户信息（用户名-密码键值对）
    public static class UserStorage
    {
        public static Dictionary<string, string> RegisteredUsers = new Dictionary<string, string>();
    }

    public static class User
    {
        // 1. 注册功能
        public static void Register()
        {
            Console.Clear();
            Console.WriteLine("===== 用户注册 =====");

            // 输入并验证用户名
            string username = string.Empty;
            while (true)
            {
                Console.Write("请输入用户名（3-15位，含字母、数字、下划线）：");
                username = Console.ReadLine()?.Trim() ?? string.Empty;

                // 空值验证
                if (string.IsNullOrEmpty(username))
                {
                    Console.WriteLine("用户名不可为空！\n");
                    continue;
                }

                // 长度与字符验证
                if (username.Length < 3 || username.Length > 15 || !System.Text.RegularExpressions.Regex.IsMatch(username, @"^[a-zA-Z0-9_]+$"))
                {
                    Console.WriteLine("用户名不符合规则！长度3-15位，仅含字母、数字、下划线。\n");
                    continue;
                }

                // 用户名唯一性验证
                if (UserStorage.RegisteredUsers.ContainsKey(username))
                {
                    Console.WriteLine("用户名已存在，请更换！\n");
                    continue;
                }
                break; // 用户名验证通过
            }

            // 输入并验证密码
            string password = string.Empty;
            while (true)
            {
                Console.Write("请输入密码（6-20位，含大写、小写、数字）：");
                password = Console.ReadLine()?.Trim() ?? string.Empty;

                // 空值验证
                if (string.IsNullOrEmpty(password))
                {
                    Console.WriteLine("密码不可为空！\n");
                    continue;
                }

                // 密码规则验证（含大写、小写、数字，长度6-20）
                bool hasUpper = password.Any(char.IsUpper);
                bool hasLower = password.Any(char.IsLower);
                bool hasDigit = password.Any(char.IsDigit);
                if (password.Length < 6 || password.Length > 20 || !hasUpper || !hasLower || !hasDigit)
                {
                    Console.WriteLine("密码不符合规则！需6-20位，含至少1个大写、1个小写、1个数字。\n");
                    continue;
                }
                break; // 密码验证通过
            }

            // 确认密码
            while (true)
            {
                Console.Write("请确认密码：");
                string confirmPwd = Console.ReadLine()?.Trim() ?? string.Empty;

                if (confirmPwd != password)
                {
                    Console.WriteLine("两次密码不一致，请重新确认！\n");
                    continue;
                }
                break; // 确认密码通过
            }

            // 注册成功：保存用户信息
            UserStorage.RegisteredUsers.Add(username, password);
            Console.WriteLine($"\n注册成功！用户名：{username}");
            Console.WriteLine("3秒后返回主菜单...");
            Thread.Sleep(3000); // 等待3秒
        }

        // 2. 登录功能
        public static void Login()
        {
            Console.Clear();
            Console.WriteLine("===== 用户登录 =====");

            // 输入用户名
            Console.Write("请输入用户名：");
            string username = Console.ReadLine()?.Trim() ?? string.Empty;
            if (string.IsNullOrEmpty(username))
            {
                Console.WriteLine("用户名不可为空！");
                BackToMenu();
                return;
            }

            // 输入密码
            Console.Write("请输入密码：");
            string password = Console.ReadLine()?.Trim() ?? string.Empty;
            if (string.IsNullOrEmpty(password))
            {
                Console.WriteLine("密码不可为空！");
                BackToMenu();
                return;
            }

            // 验证逻辑
            if (!UserStorage.RegisteredUsers.ContainsKey(username))
            {
                Console.WriteLine("登录失败：用户名不存在！");
                BackToMenu();
                return;
            }

            if (UserStorage.RegisteredUsers[username] != password)
            {
                Console.WriteLine("登录失败：密码错误！");
                BackToMenu();
                return;
            }

            // 登录成功：进入系统首页
            Console.Clear();
            Console.WriteLine($"===== 登录成功！欢迎 {username} 进入系统 =====");
            Console.WriteLine("【系统首页（模拟）】");
            Console.WriteLine("1. 个人中心  2. 消息通知  3. 退出登录");
            Console.Write("\n请选择操作（输入对应数字）：");
            string choice = Console.ReadLine()?.Trim() ?? string.Empty;
            if (choice == "3")
            {
                Console.WriteLine("退出登录成功，3秒后返回主菜单...");
                Thread.Sleep(3000);
            }
        }

        // 辅助方法：返回主菜单
        private static void BackToMenu()
        {
            Console.WriteLine("3秒后返回主菜单...");
            Thread.Sleep(3000);
        }

        // 3. 主菜单交互（核心入口）
        public static void ShowMainMenu()
        {
            while (true)
            {
                Console.Clear();
                Console.WriteLine("===== 用户系统主菜单 =====");
                Console.WriteLine("1. 登录");
                Console.WriteLine("2. 注册");
                Console.WriteLine("3. 退出");
                Console.Write("\n请选择功能（输入1-3）：");

                // 菜单选择容错
                if (!int.TryParse(Console.ReadLine()?.Trim(), out int choice))
                {
                    Console.WriteLine("请输入有效数字（1-3）！");
                    Thread.Sleep(1500);
                    continue;
                }

                // 功能分支
                switch (choice)
                {
                    case 1:
                        Login();
                        break;
                    case 2:
                        Register();
                        break;
                    case 3:
                        Console.WriteLine("程序已退出，感谢使用！");
                        return; // 退出循环，结束程序
                    default:
                        Console.WriteLine("选择无效，请输入1-3！");
                        Thread.Sleep(1500);
                        break;
                }
            }
        }
    }
}
